/**
 * 
 * Copyright (C) 2011 Cody Stoutenburg . All rights reserved.
 *
 *       This program is free software; you can redistribute it and/or
 *       modify it under the terms of the GNU Lesser General Public License
 *       as published by the Free Software Foundation; either version 2.1
 *       of the License, or (at your option) any later version.
 *
 *       This program is distributed in the hope that it will be useful,
 *       but WITHOUT ANY WARRANTY; without even the implied warranty of
 *       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *       GNU Lesser General Public License for more details.
 *
 *       You should have received a copy of the GNU Lesser General Public License
 *       along with this program; if not, write to the Free Software
 *       Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 * 
 */
package ca.usherbrooke.behaviours.goal.request;

import jade.core.AID;
import jade.lang.acl.ACLMessage;

import java.io.File;
import java.io.Serializable;

import ca.usherbrooke.agent.BasicAgent;
import ca.usherbrooke.agent.message.RequestMessageObjectGoal;
import ca.usherbrooke.goal.BasicGoal;
import ca.usherbrooke.goal.IGoal;
import ca.usherbrooke.utils.ExternalClassLoad;

/**
 * @author Cody Stoutenburg
 * 
 */
public class RequestAddGoal extends BasicRequestGoal {
	private static final long serialVersionUID = 1L;

	private static final RequestMessageObjectGoal<AddGoalInfo> generateMessage(
			AddGoalInfo goal) {
		return new RequestMessageObjectGoal<AddGoalInfo>(
				RequestMessageObjectGoal.REQUEST_ADD_GOAL, goal);
	}

	public static class AddGoalInfo implements Serializable {
		private static final long serialVersionUID = 1L;

		private final String directory;
		private final String className;
		private final String args;

		// GENERAL INFO
		private final Long entity;
		private final Float scoreTotal;
		private final Float scoreFail;
		private final Long duration;

		/**
		 * @param directory
		 * @param className
		 * @param args
		 */
		public AddGoalInfo(Long entityGuid, Float scoreTotal, Float scoreFail,
				Long duration, String filePath, String className, String args) {
			this.entity = entityGuid;
			this.scoreFail = scoreFail;
			this.scoreTotal = scoreTotal;
			this.duration = duration;

			this.directory = filePath;
			this.className = className;
			this.args = args;
		}

		public BasicGoal buildGoal() throws InstantiationException,
				IllegalAccessException, ClassNotFoundException {
			File dir = new File(directory);
			IGoal goal = (IGoal) ExternalClassLoad.getClass(dir, className)
					.newInstance();

			return new BasicGoal(entity, scoreTotal, scoreFail, duration, goal,
					args);
		}
	}

	/**
	 * @param a
	 * @param msg
	 */
	public RequestAddGoal(BasicAgent a, AID receiver, AddGoalInfo goal) {
		super(a, receiver, generateMessage(goal));
	}

	@Override
	public void messageReceive(ACLMessage resut) {
	}
}
